package com.itheima.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.domain.AddressBook;
import com.itheima.dto.AddAddressBookDto;
import com.itheima.dto.ModifyAddressBookDto;
import com.itheima.mapper.AddressBookMapper;
import com.itheima.service.AddressBookService;
import com.itheima.vo.Result;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @author itheima
 * @since 2022-05-02
 */
@RestController
@RequestMapping("addressBook")
public class AddressBookController {

    @Autowired
    private AddressBookService addressBookService;


    // 分析接口文档，分析4个地方
    // 1. 分析它前缀，编写控制器类
    // 2. 请求地址，请求方法，编写对应的控制器方法
    // 3. 分析入参
    // 4. 分析出参


    // 分析完接口文档，如何编写
    // 1. 创建controller
    // - 命名：根据接口的前缀来命名，如：POST /movements  GET /movement/list
    // - 结论：创建一个 MovementsController
    // - 为MovementController添加两个注解：
    //   - @RestController
    //   - @RequestMapping("movements")
    // 2. 创建控制器方法
    // 看接口文档，主要看以下几个部分
    // 2.1. 用什么Method POST、GET、DELETE、PUT
    // 2.2. 请求路径是什么
    // - @GetMapping
    // 2.3. 入参结构是什么类型（Query、Body、路径上面带参数）
    // - 如果是Query类型的参数，@RequestParam
    // - 如果Body类型的参数，@RequestBody + 实体类(DTO)
    // - 如果是路径上面带参数比如： user/101 这里的101代表的是 REST的传参方式
    // - 想到@PathVariable String id
    //   - 实体类统一命名为  当前方法名 + DTO
    // 2.4. 入参结构包含哪些字段
    // 2.5. 出参结构包含哪些字段
    // - 如果看到 code、msg之类的字段，那么要声明一个Result统一返回结构去承载它
    // - 剩下的字段，要声明一个vo去装
    //   - vo的命名规则 当前方法名 +

    // 3. 创建service类(包含一个interface和一个实现类）
    // service类命名：MovementsService 一般情况下和控制器保持一致即可
    // 在service内添加方法
    // 入参：
    // - 一般直接用操作的表 对应的 实体类作为入参
    // - 如果你的入参，只有3个以内，直接用形参的方式列出
    // 出参
    // - 查询方法，直接返回实体类
    // - 增、删、改方法，返回boolean

    // 4. 创建mapper类（有一个interface+一个实现类xml）
    // - 接口定义方法，命名方式：操作的表名 + Mapper（操作movement表，MovementMapper）
    // 入参：和service方法保持一致
    // 出参：
    // - 增删改：返回int值
    // - 查询：返回实体类.List<实体类>
    // 注意：在Mapper.xml里面，用ResultType = "全类名" 的方式来声明返回值类型
    // 注意：Mapper.xml里面的namespace要和对应interface全类名完全一致
    // 注意：Mapper.xml的文件路径和文件名，要和inteface 全类名完全一致

    @PostMapping("")
    public Result addAddressBook(@RequestBody AddAddressBookDto dto) {
        if (Objects.isNull(dto)) {
            return new Result(400, null, null, "参数不能为空");
        }

        AddressBook addressBook = new AddressBook();
        BeanUtils.copyProperties(dto, addressBook);
        AddressBook addressBookInfo = addressBookService.addAddressBook(addressBook);

        Integer code = Objects.nonNull(addressBookInfo) ? 1 : 0;
        String msg = Objects.nonNull(addressBookInfo) ? "添加成功" : "添加失败";

        return new Result(code, msg, addressBookInfo, null);
    }

    @PutMapping("")
    public Result modifyAddressBook(@RequestBody ModifyAddressBookDto dto) {
        if (Objects.isNull(dto)) {
            return new Result(400, null, null, "参数不能为空");
        }

        AddressBook addressBook = new AddressBook();
        BeanUtils.copyProperties(dto, addressBook);
        Boolean result = addressBookService.modifyAddressBook(addressBook);

        Integer code = result ? 1 : 0;
        String msg = result ? "修改成功" : "修改失败";

        return new Result(code, msg, null, null);
    }

    @DeleteMapping("")
    public Result removeAddressBook(@RequestParam String ids) {
        if (StrUtil.isEmpty(ids)) {
            return new Result(400, "参数不能为空", null, null);
        }

        String[] split = ids.split(",");
        List<String> idList = Arrays.asList(split);
        boolean result = addressBookService.removeAddressBookInIds(idList);

        Integer code = result ? 1 : 0;
        String msg = result ? "删除成功" : "删除失败";

        return new Result(code, msg, null, null);
    }
}
